/*
 * PrintUtils.java
 *
 * Created on 30 aprile 2007, 15.41
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package fnUtils;

/**
 *
 * @author Marty Hall, http://www.apl.jhu.edu/~hall/java/
 */

import java.awt.*;
import javax.swing.*;
import java.awt.print.*;

/**
 * A simple utility class that lets you very simply print
 *  an arbitrary component. Just pass the component to the
 *  PrintUtils.printComponent. The component you want to
 *  print doesn't need a print method and doesn't have to
 *  implement any interface or do anything special at all.
 * 
 *  If you are going to be printing many times, it is marginally more
 *  efficient to first do the following:
 * 
 *    PrintUtils printHelper = new PrintUtils(theComponent);
 * 
 *  then later do printHelper.print(). But this is a very tiny
 *  difference, so in most cases just do the simpler
 *  PrintUtils.printComponent(componentToBePrinted).
 * 
 *  7/99 Marty Hall, http://www.apl.jhu.edu/~hall/java/
 *  May be freely used or adapted.
 */

public class PrintUtils implements Printable {
    private int compheight;
    private int compwidth;
    private Component componentToBePrinted;
    
    public static void printComponent(Component c) {
        new PrintUtils(c).print();
    }
    
    public PrintUtils(Component componentToBePrinted) {
        this.componentToBePrinted = componentToBePrinted;
        this.compheight=componentToBePrinted.getHeight();
        this.compwidth=componentToBePrinted.getWidth();
    }
    
    public void print() {
        PrinterJob printJob = PrinterJob.getPrinterJob();
        printJob.setPrintable(this);
        if (printJob.printDialog())
            try {
                printJob.print();
            } catch(PrinterException pe) {
                System.out.println("Error printing: " + pe);
            }
    }
    
    public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
        if (pageIndex > 0) {
            return(NO_SUCH_PAGE);
        } else {
            Graphics2D g2d = (Graphics2D)g;
            double xScale = (pageFormat.getImageableWidth() / compwidth);
            double yScale = (pageFormat.getImageableHeight() / compheight);         
            
            g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
            g2d.scale(xScale,yScale);
            disableDoubleBuffering(componentToBePrinted);
            componentToBePrinted.paint(g2d);
            enableDoubleBuffering(componentToBePrinted);
            return(PAGE_EXISTS);
        }
    }
    
    /** The speed and quality of printing suffers dramatically if
     *  any of the containers have double buffering turned on.
     *  So this turns if off globally.
     *  @see enableDoubleBuffering
     */
    public static void disableDoubleBuffering(Component c) {
        RepaintManager currentManager = RepaintManager.currentManager(c);
        currentManager.setDoubleBufferingEnabled(false);
    }
    
    /** Re-enables double buffering globally. */
    
    public static void enableDoubleBuffering(Component c) {
        RepaintManager currentManager = RepaintManager.currentManager(c);
        currentManager.setDoubleBufferingEnabled(true);
    }
}
